Skip to main content

Hierarchy Reports

DataTable

using System.Data;
using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// get data and columnMapping
var data = DemoDataTable.GetDataTable();
var columnMapping = DemoDataTable.GetFieldMapping();

// set filePath
string filePath = @"..\OutputFile.xlsx";

// set exportOption
var exportOption = new SingleDataSetOptions();

// call export method
Stream stream = exportManager.Export(ExportType.Excel, data, exportOption, columnMapping);

// save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoDataTable
{
// method to create datatable
internal static DataTable GetDataTable()
{
DataTable table = new() { TableName = "Structural Liquidity" };

// add columns
table.Columns.Add("FName", typeof(string));
table.Columns.Add("B1", typeof(int));
table.Columns.Add("B2", typeof(int));
table.Columns.Add("B3", typeof(int));
table.Columns.Add("B4", typeof(int));
table.Columns.Add("B5", typeof(int));
table.Columns.Add("CID", typeof(int));
table.Columns.Add("PId", typeof(int));
table.Columns.Add("Depth", typeof(int));
table.Columns.Add("Type", typeof(int));

// add rows
table.Rows.Add("Reserves and Surplus", 100, 200, 400, 500, 600, 1, 0, 0, 0);
table.Rows.Add("Savings A/Cs -Elite", 100, 200, 400, 500, 600, 2, 0, 3, 1);
table.Rows.Add("Deposits", 100, 200, 400, 500, 600, 3, 0, 0, 0);
table.Rows.Add("Current Deposits", 100, 200, 400, 500, 600, 4, 0, 3, 0);
table.Rows.Add("Savings Bank", 100, 200, 400, 500, 600, 5, 0, 3, 0);

return table;
}

// column mapping
internal static Dictionary<string, string> GetFieldMapping() =>
new()
{
{ "Id", "CID" },
{ "Name", "FName" },
{ "ParentId", "PId" },
{ "Depth", "Depth" },
{ "Type", "Type" },
};
}
}

HierarchyReportItem

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// get data and metadata
var data = GetDemoHierarchyDatas();
var metadata = GetDemoHierarchyMetaData();

// set filePath
string filePath = @"..\OutputFile.xlsx";

// set exportOption
var exportOption = new SingleDataSetOptions() { Metadata = metadata, };

// call Export method
Stream stream = exportManager.Export(ExportType.Excel, data, exportOption);

// save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}
}

HierarchyDataSet

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// get data (List<HierachyReportItem<YourDataModel>>)
var data = GetDemoHierarchyDatas();
// get metadata
var metadata = GetDemoHierarchyMetaData();

// set filePath
string filePath = @"..\OutputFile.xlsx";

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(data)
{
Metadata = metadata, //optional property
};

/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with HierarchyDataSet
var datasetBaseList = new List<DataSetBase>() { hierarchyDataset, };

/* NOTE:
* When passing Datasets, an instance of ExportOptions is required.
* (NOT SingleDataSetOptions - it's properties are already present in Datasets)
*/
// Set exportOption
var exportOption = new ExportOptions();

// call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}
}

HierarchyDataSet with Parameter Data

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// get data (List<HierachyReportItem<YourDataModel>>)
var data = GetDemoHierarchyDatas();
// get metadata
var metadata = GetDemoHierarchyMetaData();
// Get data for ParamSectionDataSet
var paramData = GetParamSecData();

// set filePath
string filePath = @"..\OutputFile.xlsx";

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(data)
{
Metadata = metadata, //optional property
};
// create ParamSectionDataSet
var paramSectionDataSet = new ParamSectionDataSet(paramData);

/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with HierarchyDataSet, ParamSectionDataSet
var datasetBaseList = new List<DataSetBase>() { hierarchyDataset, paramSectionDataSet };

/* NOTE:
* When passing Datasets, an instance of ExportOptions is required.
* (NOT SingleDataSetOptions - it's properties are already present in Datasets)
*/
// Set exportOption
var exportOption = new ExportOptions();

// call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}

// Method to create to Parameter data
internal static Dictionary<string, string> GetParamSecData()
{
Dictionary<string, string> dict =
new()
{
{ "Bank", "Surya" },
{ "As On", "31-05-2019" },
{ "Currency", "INR" },
{ "Denomination", "Units" },
{ "Model", "08' Mar'21 ALCO" },
{ "Plan", "Q4 Mar-21 and 3 Year Forecast" },
{ "Plan Entry Type", "Target EOP Balance" },
{ "Report For", "3 Months" },
{ "LLG Description", "Loans - CC" },
{ "Current Int. Rate % (D0)", "0.00" },
{ "Int. Calc. Basis", "30/360" }
};
return dict;
}
}

HierarchyDataSet with Search Object Data

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Primitives;
using Surya.Ab.Dto;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// Set filePath
string filePath = @"..\OutputFile.xlsx";

// get data (List<HierachyReportItem<YourDataModel>>)
var data = GetDemoHierarchyDatas();
// get metadata
var metadata = GetDemoHierarchyMetaData();

// get data for search object dataset
var searchObjectData = GetSearchDetails();

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<KeyType, YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(data)
{
SheetName = "Sheet 1",
Metadata = metadata, //optional property
};
// create SearchObjectDataset
var searchObjectDataSet = new SearchObjectDataset(searchObjectData)
{
SheetName = "Sheet 1",
Header = "Filters",
DataSetGap = 0,
Width = 300
};

/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with HierarchyDataSet, SearchObjectDataset
var datasetBaseList = new List<DataSetBase>() { searchObjectDataSet, hierarchyDataset };

/* NOTE:
* When passing Datasets, an instance of ExportOptions is required.
* (NOT SingleDataSetOptions - it's properties are already present in Datasets)
*/
// Set exportOption
var exportOption = new ExportOptions();

// Call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// Save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}

// Method to create to Search Object data
internal static List<SearchDet> GetSearchDetails()
{
return new List<SearchDet>
{
new SearchDet
{
Fields = new()
{
new AbFieldInfo
{
FieldName = "First Name",
Value = "Deepak",
Operator = "eq"
},
new AbFieldInfo
{
FieldName = "Age",
Value = "20",
Operator = "gt"
},
new AbFieldInfo
{
FieldName = "DOB",
Value = new StringValues(new string[] { "2000-01-01", "2005-01-01" }),
Operator = "bt"
}
},
MatchAllFields = true
},
new SearchDet
{
Fields = new()
{
new AbFieldInfo
{
FieldName = "Role",
Value = new StringValues(new string[] { "Developer", "Tester" }),
Operator = "in"
},
new AbFieldInfo
{
FieldName = "Salary",
Value = "10,000",
Operator = "lt"
}
},
MatchAllFields = false
},
new SearchDet
{
Fields = new()
{
new AbFieldInfo
{
FieldName = "First Name",
Value = "Deepak",
Operator = "eq"
},
new AbFieldInfo
{
FieldName = "Age",
Value = "20",
Operator = "gt"
},
new AbFieldInfo
{
FieldName = "DOB",
Value = new StringValues(new string[] { "2000-01-01", "2005-01-01" }),
Operator = "bt"
}
},
MatchAllFields = true
},
};
}
}

HierarchyDataSet with Images

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Drawing.Client.Enums;
using Surya.Ab.Drawing.Client.Models;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// Set filePath
string filePath = @"..\OutputFile.xlsx";

// get data (List<HierachyReportItem<YourDataModel>>)
var data = GetDemoHierarchyDatas();
// get metadata
var metadata = GetDemoHierarchyMetaData();

//ImageDataset
var imageDataset = GetDemoImageDataset();
imageDataset.SheetName = "Sheet 1";

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<KeyType, YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(data)
{
SheetName = "Sheet 1",
Metadata = metadata, //optional property
};

/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with ReportDataSet and ImageDataSet
var datasetBaseList = new List<DataSetBase>()
{
imageDataset,
hierarchyDataset,
};

/* NOTE:
* When passing Datasets, an instance of ExportOptions is required.
* (NOT SingleDataSetOptions - it's properties are already present in Datasets)
*/
// Set exportOption
var exportOption = new ExportOptions();

// Call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// Save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}

// method to create ImageDataset
internal static ImageDataset GetDemoImageDataset()
{
var images = new List<AbImage>
{
//Pass Image content as null to create empty spaces between images
new AbImage(null, AbImageType.Png) { Height = 20, Width = 200 },
new AbImage(File.ReadAllBytes("..\\HDFC_logo.jpg"), AbImageType.Jpeg)
{
Height = 70,
Width = 200,
},
};

var imageDataset = new ImageDataset(images)
{
Display = ImageDatasetDisplay.SingleRow,
FitToPage = true
};

return imageDataset;
}
}

HierarchyDataSet with ReportDataSet

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// Get data and metadata for ReportDataSet
var data = GetDemoData();
var metadata = GetDemoMetaData();

// For HierarchyDataSet
// get data (List<HierachyReportItem<YourDataModel>>)
var hrData = GetDemoHierarchyDatas();
// get metadata
var hrMetadata = GetDemoHierarchyMetaData();

// set filePath
string filePath = @"..\OutputFile.xlsx";

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(hrData)
{
Metadata = hrMetadata, //optional property
};
// create ReportDataSet
var reportDataset = new ReportDataSet(data)
{
Metadata = metadata, // optional
};

/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with HierarchyDataSet, ReportDataSet
var datasetBaseList = new List<DataSetBase>() { hierarchyDataset };

// set ExportOptions
var exportOption = new ExportOptions();

// call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel for Hierarchy Report
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
new HierarchyReportItem<int, DemoHierarchyData>
{
Id = 4,
Name = "Deposits",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600"
},
},
};
}

// Create metadata for Hierarchy Model
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.None
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}

// Sample Data Model for Simple Report
internal class DemoData
{
public string? Name { get; set; }
public double AccountBalance { get; set; }
}

// Method to create Sample Data Instances
internal static List<DemoData> GetDemoData()
{
List<DemoData> data =
new()
{
new DemoData { Name = "Deposit", AccountBalance = 1540.457476 },
new DemoData { Name = "Current", AccountBalance = 100 },
new DemoData { Name = "Borrowing", AccountBalance = 100 },
new DemoData { Name = "Other", AccountBalance = 100 },
};
return data;
}

// Method to create Metadata for Simple Report
internal static List<PropertyMetadata> GetDemoMetaData()
{
List<PropertyMetadata> metadata =
new()
{
new PropertyMetadata()
{
Code = "Name",
DisplayName = "Name",
DisplayOrder = 1,
DataType = DataType.String,
DisplayType = DisplayType.XXXL
},
new PropertyMetadata()
{
Code = "AccountBalance",
DisplayName = "Balance",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.Amount
},
};
return metadata;
}
}

HierarchyDataSet with RichHeader

Sample Output: RichHeaderHierarchy

Sample Program:

using Microsoft.Extensions.DependencyInjection;
using Surya.Ab.Export.Client.Enum;
using Surya.Ab.Export.Client.Interface;
using Surya.Ab.Export.Client.Models;
using Surya.Ab.Metadata.Enums;
using Surya.Ab.Metadata.Models;

namespace ExportExample;

public class Program
{
public static void Main()
{
IServiceCollection services = new ServiceCollection();
services.AddAbExport();
var serviceProvider = services.BuildServiceProvider();
var exportManager = serviceProvider.GetRequiredService<IExporter>();

// Set filePath
string filePath = @"..\OutputFile.xlsx";

// For HierarchyDataSet
// get data (List<HierachyReportItem<YourDataModel>>)
var hrData = GetDemoHierarchyDatas();
// get metadata
var hrMetadata = GetDemoHierarchyMetaData();

// create HierarchyDataSet
// SYNTAX: new HierarchyDataSet<YourDataModel>(data);
var hierarchyDataset = new HierarchyDataSet<int, DemoHierarchyData>(hrData)
{
Metadata = hrMetadata, //optional property,
TableHeader = GetRichHeader()
};


/* NOTE:
* DatasetBase is the base class for all Dataset types.
* List<DatasetBase> is used to pass one or more datasets.
*/
//Create DatasetBase List with ReportDataSet
var datasetBaseList = new List<DataSetBase>()
{
hierarchyDataset
};

/* NOTE:
* When passing Datasets, an instance of ExportOptions is required.
* (NOT SingleDataSetOptions - it's properties are already present in Datasets)
*/
// Set exportOption
var exportOption = new ExportOptions();

// Call Export method
Stream stream = exportManager.Export(ExportType.Excel, datasetBaseList, exportOption);

// Save stream to file
using (FileStream outputFileStream = new(filePath, FileMode.Create))
{
stream.CopyTo(outputFileStream);
}
}

// Sample DataModel for Hierarchy Report
internal class DemoHierarchyData
{
public string? B1 { get; set; }
public string? B2 { get; set; }
public string? B3 { get; set; }
public string? B4 { get; set; }
public string? B5 { get; set; }
public string? B6 { get; set; }
public string? B7 { get; set; }
public string? B8 { get; set; }
public string? B9 { get; set; }
public string? B10 { get; set; }
public string? B11 { get; set; }
public string? B12 { get; set; }
}

// Create HierarchyReportItem<Sample DataModel>
internal static List<HierarchyReportItem<int, DemoHierarchyData>> GetDemoHierarchyDatas()
{
return new List<HierarchyReportItem<int, DemoHierarchyData>>()
{
new()
{
Id = 1,
Name = "Capital",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600",
B6 = "700",
B7 = "900",
B8 = "1000",
B9 = "100",
B10 = "200",
B11 = "400",
B12 = "500"
},
},
new()
{
Id = 2,
Name = "Reserves and Surplus",
ParentId = 0,
Depth = 0,
Type = ReportItemType.NDI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600",
B6 = "700",
B7 = "900",
B8 = "1000",
B9 = "100",
B10 = "200",
B11 = "400",
B12 = "500",
},
},
new()
{
Id = 3,
Name = "Savings A/Cs -Elite",
ParentId = 2,
Depth = 0,
Type = ReportItemType.DI,
DynamicFieldValues = new DemoHierarchyData
{
B1 = "100",
B2 = "200",
B3 = "400",
B4 = "500",
B5 = "600",
B6 = "700",
B7 = "900",
B8 = "1000",
B9 = "100",
B10 = "200",
B11 = "400",
B12 = "500"
},
}
};
}

// Create metadata for Hierarchy Model
internal static List<PropertyMetadata> GetDemoHierarchyMetaData()
{
List<PropertyMetadata> demoHierarchyMetaData =
new()
{
new PropertyMetadata()
{
Code = "B1",
DisplayName = "Day 1",
DisplayOrder = 2,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B2",
DisplayName = "2D - 7D",
DisplayOrder = 3,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B3",
DisplayName = "8D - 14D",
DisplayOrder = 4,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B4",
DisplayName = "15D - 30D",
DisplayOrder = 5,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B5",
DisplayName = "31D - 2M",
DisplayOrder = 6,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B6",
DisplayName = "2M - 3M",
DisplayOrder = 7,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B7",
DisplayName = "3M - 6M",
DisplayOrder = 8,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B8",
DisplayName = "6M - 1Y",
DisplayOrder = 9,
DataType = DataType.Number,
DisplayType = DisplayType.Amount
},
new PropertyMetadata()
{
Code = "B9",
DisplayName = "1Y - 3Y",
DisplayOrder = 10,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B10",
DisplayName = "3Y - 5Y",
DisplayOrder = 11,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B11",
DisplayName = "5Y - 7Y",
DisplayOrder = 12,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
new PropertyMetadata()
{
Code = "B12",
DisplayName = "7Y - 10Y",
DisplayOrder = 13,
DataType = DataType.Number,
DisplayType = DisplayType.Integer
},
};
return demoHierarchyMetaData;
}


// Method to create RichHeader
internal static List<AbHeader> GetRichHeader()
{
HeaderGroup header1 = new HeaderGroup()
{
Name = "Header 1",
SubHeaderGroup = new() { Name = "SubHeader 1", }
};
HeaderGroup header2 = new HeaderGroup()
{
Name = "Header 1",
SubHeaderGroup = new() { Name = "SubHeader 2", }
};
HeaderGroup header3 = new HeaderGroup() { Name = "Header 2" };

List<AbHeader> headers =
new()
{
new() { Code = "B1", HeaderGroup = header1 },
new() { Code = "B2", HeaderGroup = header1 },
new() { Code = "B3", HeaderGroup = header1 },
new() { Code = "B4", HeaderGroup = header2 },
new() { Code = "B5", HeaderGroup = header2 },
new() { Code = "B6", HeaderGroup = header2 },
new() { Code = "B8", HeaderGroup = header3 },
new() { Code = "B9", HeaderGroup = header3 },
new() { Code = "B10", HeaderGroup = header3 }
};

return headers;
}
}

Edit on GitHub